/**********************************************************************************************/
// ValentinaInterface.cpp
//
// This file providing interface for Valentina database
// Copyright Diamant Group 2007
/**********************************************************************************************/
#include "ValentinaInterface.h"

FBL::I_Database_Ptr			pOpenDb;
VSQL::I_SqlDatabase_Ptr		pSqlDb;

/**********************************************************************************************/
void InitEngine( void )
{
	InitValentina( 4 * 1024 * 1024 );
	pOpenDb = NULL;
}

/**********************************************************************************************/
void Shutdown()
{
	ShutdownValentina();
}

/**********************************************************************************************/
void CreateDatabase( wxString inPath )
{
	FBL::I_Database_Ptr pFblDb = MakeNewDatabase();

	I_Location_Ptr pLocation = CreateDiskLocation( inPath.c_str() );

	pFblDb->put_Location( pLocation );

	pFblDb->Create();

	pFblDb->Close();
}

/**********************************************************************************************/
void OpenDatabase( wxString inPath )
{
	pSqlDb = CreateSqlDatabase( kStorage_Disk );
	pOpenDb = pSqlDb->get_BaseDatabase();

	I_Location_Ptr pLocation = CreateDiskLocation( inPath.c_str() );

	pOpenDb->put_Location( pLocation );

	pOpenDb->Open();
}

/**********************************************************************************************/
void CloseDatabase( void )
{
	pOpenDb->Close();
}

/**********************************************************************************************/
void CreateTable( wxString inName )
{
	 pOpenDb->CreateTable( inName.c_str() );
}

/**********************************************************************************************/
void CreateField( wxString inTName, wxString inFName, tFIELD_TYPE inType )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		pTable->CreateField( Wx2String(inFName), get_Type( inType ) );
	}
}	

/**********************************************************************************************/
void SetBlank( wxString inTName )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		pTable->SetBlank();
	}
}

/**********************************************************************************************/
void AddRecord(wxString inTName )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		pTable->AddRecord();
	}
}

/**********************************************************************************************/
void SetValue( wxString inTName, wxString inFName, wxString inValue )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );
		
	if( pTable )
	{
		I_Field_Ptr pField = pTable->get_Field( Wx2String( inFName ) );
		if( pField )
		{
			I_Value_Ptr pVal = pField->get_Value( FBL::forUpdate );
			pVal->put_String( Wx2String( inValue ) );
			pField->put_Value( pVal );
		}
	}
}

/**********************************************************************************************/
void SetValue( wxString inTName, wxString inFName, long inValue )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		I_Field_Ptr pField = pTable->get_Field( Wx2String( inFName ) );
		if( pField )
		{
			I_Value_Ptr pVal = pField->get_Value( FBL::forUpdate );
			pVal->put_Long( inValue );
			pField->put_Value( pVal );
		}
	}
}

/**********************************************************************************************/
long GetRecCount(wxString inTName )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		return pTable->get_RecordCount();
	}
	return 0;
}

/**********************************************************************************************/
wxString GetStringValue(wxString inTName, wxString inFName, long inPos )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		wxString sQuery = _T("SELECT * FROM ");
		sQuery+=inTName;
		
		I_Cursor_Ptr pCursor = pSqlDb->SqlSelect( Wx2String( sQuery ) );

		if( pCursor )
		{
			pCursor->put_Position( inPos );

			I_Field_Ptr pField = pCursor->get_Field( Wx2String( inFName ) );
			if( pField )
			{
				Const_I_Value_Ptr pv = pField->get_Value();
				String str = pv->get_String();

				vsV2_St2wx *pConv = new vsV2_St2wx( str );
				return pConv->wx_str();
			}
		}
	}
	return wxEmptyString;
}

/**********************************************************************************************/
long GetLongValue(wxString inTName, wxString inFName, long inPos )
{
	I_Table_Ptr pTable = pOpenDb->get_Table( Wx2String( inTName ) );

	if( pTable )
	{
		wxString sQuery = _T("SELECT * FROM ");
		sQuery+=inTName;

		I_Cursor_Ptr pCursor = pSqlDb->SqlSelect( Wx2String( sQuery ) );

		if( pCursor )
		{
			pCursor->put_Position( inPos );

			I_Field_Ptr pField = pCursor->get_Field( Wx2String( inFName ) );
			if( pField )
			{
				Const_I_Value_Ptr pv = pField->get_Value();
				long res = pv->get_Long();
				return res;
			}
		}
	}
	return 0;
}

/**********************************************************************************************/
String Wx2String( wxString inStr )
{
	return String( inStr.c_str() );
}

/**********************************************************************************************/
FBL::VALUE_TYPE get_Type( FIELD_TYPE inType )
{
	if( inType == STRING_FIELD )
		return FBL::kTypeString;
	else if( inType == LONG_FIELD )
		return FBL::kTypeLong;
	else
		return 0;
}